// pages/result/result.js
// 定义咨询结果页面，用于老师或工作人员填写心理咨询评测结果
Page({
  data: {
    requestId: '',  // 咨询申请ID
    requestDetail: null,  // 申请详情对象
    formData: {
      evaluationTime: '',  // 评测时间
      location: '',  // 评测地点
      mentalStatus: '',  // 心理状态评估
      suggestion: '',  // 咨询建议
      notes: ''  // 备注信息
    },
    mentalStatusOptions: ['良好', '一般', '较差', '严重'],  // 心理状态选项
    todayDate: '',  // 当前日期
    loading: true,  // 是否加载中
    submitting: false,  // 是否正在提交表单
    isTeacher: false,  // 是否为老师
    isStaff: false,  // 是否为工作人员
    isViewOnly: false  // 仅查看模式
  },

  // 页面加载时执行的函数，处理传入的参数
  onLoad: function(options) {
    console.log('咨询结果页面加载，参数:', options);
    
    // 检查是否有必要的requestId参数，如果没有则显示错误并返回
    if (!options.requestId) {
      console.error('参数错误: 缺少requestId参数');
      wx.showToast({
        title: '参数错误',
        icon: 'none'
      });
      setTimeout(() => {
        wx.navigateBack();
      }, 1500);
      return;
    }

    // 获取用户信息和角色，确定用户权限
    const userInfo = wx.getStorageSync('userInfo');
    const isTeacher = userInfo && userInfo.role === 'teacher';
    const isStaff = userInfo && userInfo.role === 'staff';
    
    // 设置查看模式标志，现在工作人员也可以编辑咨询结果
    const isViewOnly = false;
    
    this.setData({
      requestId: options.requestId,
      isTeacher,
      isStaff,
      isViewOnly
    });

    // 设置今天日期作为默认评测时间
    const today = new Date();
    const formattedDate = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;
    
    console.log('设置默认日期:', formattedDate);
    this.setData({
      todayDate: formattedDate,
      'formData.evaluationTime': formattedDate
    });

    // 加载申请详情数据
    this.loadRequestDetail();
  },

  // 加载咨询申请详情数据
  loadRequestDetail: async function() {
    console.log('开始加载申请详情, ID:', this.data.requestId);
    try {
      // 初始化数据库连接
      const db = wx.cloud.database();
      console.log('开始查询数据库');
      const result = await db.collection('consultation_requests').doc(this.data.requestId).get();
      
      console.log('查询结果:', result);
      if (result && result.data) {
        const requestDetail = result.data;
        console.log('申请详情:', requestDetail);
        
        // 检查申请状态，只有已批准的申请才能填写结果
        console.log('检查申请状态:', requestDetail.status);
        if (requestDetail.status !== 'approved') {
          console.error('申请状态不是已批准:', requestDetail.status);
          wx.showToast({
            title: '该申请未通过审批或已完成',
            icon: 'none'
          });
          setTimeout(() => {
            wx.navigateBack();
          }, 1500);
          return;
        }

        // 检查用户权限，确保只有老师或工作人员能访问此页面
        if (!this.data.isTeacher && !this.data.isStaff) {
          console.error('用户不是老师或工作人员');
          wx.showToast({
            title: '您没有权限查看此页面',
            icon: 'none'
          });
          setTimeout(() => {
            wx.navigateBack();
          }, 1500);
          return;
        }
        
        // 如果申请中有指定位置，则预填表单
        if (requestDetail.location) {
          console.log('预填表单位置:', requestDetail.location);
          this.setData({
            'formData.location': requestDetail.location
          });
        }
        
        // 更新页面数据，显示申请详情
        console.log('设置申请详情到页面数据');
        this.setData({
          requestDetail,
          loading: false
        });

        // 如果申请已完成或处于查看模式，则加载已有的评测结果
        if (requestDetail.status === 'completed' || this.data.isViewOnly) {
          this.loadEvaluationResult();
        }
      } else {
        console.error('未找到申请数据');
        throw new Error('未找到申请数据');
      }
    } catch (error) {
      // 错误处理：显示提示并停止加载状态
      console.error('获取申请详情失败', error);
      wx.showToast({
        title: '获取数据失败，请重试',
        icon: 'none'
      });
      this.setData({ loading: false });
    }
  },

  // 加载已有的评测结果数据
  loadEvaluationResult: async function() {
    try {
      // 查询数据库中对应学生的最新咨询记录
      const db = wx.cloud.database();
      const result = await db.collection('consultation_records')
        .where({
          userId: this.data.requestDetail.studentId
        })
        .orderBy('createTime', 'desc')
        .limit(1)
        .get();

      // 如果找到咨询记录，则填充到表单中
      if (result.data && result.data.length > 0) {
        const consultationRecord = result.data[0];
        console.log('获取到咨询记录:', consultationRecord);
        
        // 处理并格式化评测日期
        let evaluationTime = consultationRecord.evaluationTime;
        if (evaluationTime) {
          if (typeof evaluationTime === 'string') {
            evaluationTime = new Date(evaluationTime);
          } else if (evaluationTime instanceof Date) {
            // 已经是Date对象
          } else {
            evaluationTime = new Date(evaluationTime);
          }
          
          // 将日期转换为YYYY-MM-DD格式
          const formattedDate = `${evaluationTime.getFullYear()}-${String(evaluationTime.getMonth() + 1).padStart(2, '0')}-${String(evaluationTime.getDate()).padStart(2, '0')}`;
          consultationRecord.evaluationTimeFormatted = formattedDate;
        }
        
        // 将咨询记录数据设置到表单中
        this.setData({
          formData: {
            evaluationTime: consultationRecord.evaluationTimeFormatted || this.data.formData.evaluationTime,
            location: consultationRecord.location || '',
            mentalStatus: consultationRecord.mentalStatus || '',
            suggestion: consultationRecord.suggestion || '',
            notes: consultationRecord.notes || ''
          }
        });
      }
    } catch (error) {
      console.error('获取咨询记录失败', error);
    }
  },

  // 以下是表单各项变化的处理函数
  // 日期选择器变化处理
  onDateChange: function(e) {
    if (this.data.isViewOnly) return;
    this.setData({
      'formData.evaluationTime': e.detail.value
    });
  },

  // 地点输入框变化处理
  onLocationInput: function(e) {
    if (this.data.isViewOnly) return;
    this.setData({
      'formData.location': e.detail.value
    });
  },

  // 心理状态选择器变化处理
  onMentalStatusChange: function(e) {
    if (this.data.isViewOnly) return;
    this.setData({
      'formData.mentalStatus': this.data.mentalStatusOptions[e.detail.value]
    });
  },

  // 建议文本框变化处理
  onSuggestionInput: function(e) {
    if (this.data.isViewOnly) return;
    this.setData({
      'formData.suggestion': e.detail.value
    });
  },

  // 备注文本框变化处理
  onNotesInput: function(e) {
    if (this.data.isViewOnly) return;
    this.setData({
      'formData.notes': e.detail.value
    });
  },

  // 表单提交处理函数
  submitForm: async function() {
    // 检查用户权限，确保只有老师或工作人员能提交
    if (!this.data.isTeacher && !this.data.isStaff) {
      wx.showToast({
        title: '只有老师或工作人员可以提交咨询结果',
        icon: 'none'
      });
      return;
    }

    // 表单字段验证，确保必填项已填写
    const formData = this.data.formData;
    if (!formData.evaluationTime) {
      wx.showToast({
        title: '请选择评测时间',
        icon: 'none'
      });
      return;
    }

    if (!formData.location) {
      wx.showToast({
        title: '请输入评测地点',
        icon: 'none'
      });
      return;
    }

    if (!formData.mentalStatus) {
      wx.showToast({
        title: '请选择心理状态',
        icon: 'none'
      });
      return;
    }

    if (!formData.suggestion) {
      wx.showToast({
        title: '请输入建议',
        icon: 'none'
      });
      return;
    }

    // 显示确认对话框，防止误操作
    wx.showModal({
      title: '提交确认',
      content: '确定提交咨询结果？提交后不可修改',
      success: res => {
        if (res.confirm) {
          this.doSubmitForm();
        }
      }
    });
  },

  // 执行表单提交的具体逻辑
  doSubmitForm: async function() {
    // 设置提交中状态，防止重复提交
    this.setData({ submitting: true });
    
    try {
      const db = wx.cloud.database();
      const userInfo = wx.getStorageSync('userInfo');
      
      // 获取学生信息
      const requestDetail = this.data.requestDetail || {};
      const studentName = requestDetail.studentName || '未知学生';
      
      // 创建咨询记录对象
      const consultationRecord = {
        userId: this.data.requestDetail.studentId,
        username: studentName, // 使用studentName作为username
        staffId: userInfo.openId || userInfo._openid,
        content: '基于学生申请的心理咨询', // 默认咨询内容
        mentalStatus: this.data.formData.mentalStatus,
        conclusion: '来自学生申请的心理咨询结果',
        suggestion: this.data.formData.suggestion,
        location: this.data.formData.location,
        evaluationTime: new Date(this.data.formData.evaluationTime),
        notes: this.data.formData.notes,
        createTime: new Date(),
        updateTime: new Date()
      };
      
      // 将咨询记录添加到数据库
      await db.collection('consultation_records').add({
        data: consultationRecord
      });
      
      // 更新原申请的状态为已完成
      await db.collection('consultation_requests').doc(this.data.requestId).update({
        data: {
          status: 'completed',
          username: studentName, // 确保studentName字段被保存
          updateTime: new Date()
        }
      });
      
      // 显示成功提示并返回上一页
      wx.showToast({
        title: '提交成功',
        icon: 'success',
        duration: 1500
      });
      
      setTimeout(() => {
        wx.navigateBack({ delta: 1 });
      }, 1500);
    } catch (error) {
      // 错误处理：显示失败提示
      console.error('提交咨询结果失败', error);
      wx.showToast({
        title: '提交失败，请重试',
        icon: 'none'
      });
    } finally {
      // 无论成功失败，重置提交状态
      this.setData({ submitting: false });
    }
  },

  // 取消填写表单，返回上一页
  cancelForm: function() {
    wx.showModal({
      title: '确认取消',
      content: '确定放弃填写咨询结果？',
      success: res => {
        if (res.confirm) {
          // 直接返回，确保导航执行
          setTimeout(() => {
            wx.navigateBack({ delta: 1 });
          }, 100);
        }
      }
    });
  },

  // 自定义导航栏返回按钮处理
  goBack: function() {
    console.log('返回按钮被点击');
    // 如果正在提交，阻止返回操作
    if (this.data.submitting) {
      wx.showToast({
        title: '正在提交，请稍候',
        icon: 'none'
      });
      return;
    }
    
    // 如果是查看模式，直接返回
    if (this.data.isViewOnly) {
      wx.navigateBack();
      return;
    }
    
    // 如果已填写内容，则显示确认取消对话框
    const formData = this.data.formData;
    if (formData.location || formData.mentalStatus || 
        formData.suggestion || formData.notes) {
      this.cancelForm();
    } else {
      wx.navigateBack();
    }
  }
})